2

概述

谢谢大家的收藏与赞,这是对我最大的鼓励。

这一系列文章主要是一些PHP常用的类操作,回顾一下面向对象,我一直致力于小白文章的撰写,因为我也是小白,相信有人需要,希望读者能够喜欢。

说明

  • 关于PHP语言实现各种操作类,网上都能够找得到,但是质量参差不齐,有的代码不好懂,有时候看的眼花缭乱,所以我在这里统一作了一个整理(注意:是整理,每一种操作类,我至少会参考三份优秀代码,然后自己跑出来,而不是CV)
  • 我会尽量遵守PSR规范,会有很详细易懂的注释
  • 对于其中涉及到的相关知识点,比如设计模式,类型检测、浏览器架构、通信数据我也会简单讲讲,并留下相关链接,希望读者能够细嚼慢咽

阅读准备

内容涉及面向对象、数据库、文件操作、购物车、分页、图像处理、JSON数据接口,你可能需要有一点知识基础,当然,这些内容都是独立的,可以选择性的参看。

Source Code

<?php
/**
 * TODO:数据库模型类
 * Author:entner
 * time:   2017-5-6
 * version:1.0
 */

Class DB{
    protected $HOST = '127.0.0.1';     //主机地址
    protected $DATABASE;               
    protected $USER ="root";           //数据库用户名
    protected $ROOT ="root";           //数据库用户密码
    private static $resource;          //数据库连接资源句柄 
    private static  $instance;        //静态变量保存类的唯一实例

    /**
     * 构造函数和克隆函数必须声明为私有的,防止外部获取
     */
    private function __construct(){    
            echo "hello";
    }

    /**
     * TODO:获取操作类实例
     * 单例模式:只给一个入口
     * static : 让连接静态化,不需要重复声明
     */
    public static function getInstance(){
        if(!self::$instance instanceof self){
            self::$instance = new self();
        }
        return self::$instance;
    }


    /**
    * TODO:数据库连接
    * @pagram $dbname string 数据库名称
    */
    public function connect($dbname = "mail"){
        $this->DATABASE = $dbname;
        /*    判断数据库是否连接     */
        if(!self::$resource){
            self::$resource = mysqli_connect($this->HOST,$this->USER,$this->ROOT,$this->DATABASE);
            /*    如果数据库连接失败        */
            if(!self::$resource){
                throw new Execption('mysql connect error'.mysqli_connect_error());
            }
            /*   设置编码   */
            mysqli_query(self::$resource,"set names UTF8");
        }
        return self::$resource;
    }



}

/**********Coding 1*********************
$res = DB::getInstance()->connect("base");    
print_r($res);
die;
********************************/


/**********Coding 2*********************
 $res = new DB();
 $res::getInstance()->connect();  
 因为构造函数的私有性,这一句会产生fatal error 错误
********************************/


/**********Coding 3*********************
$a = DB::getInstance();
$a->connect();
                        
$b = DB::getInstance();
$b->connect();

echo "<pre>";
print_r($a);
print_r($b);

只会执行一次构造函数,说明$a $b是类的同一个实例
********************************/

解析

如果不看构造函数getInstance方法,其实可以看的出来,实现数据库操作类很简单,只需要把数据库连接函数的参数当作类成员变量,然后调用就行了,但是这里用了一个简单的设计模式——单例模式,总之加上它,代码会更便捷、健壮,下面简单讲讲。

为什么使用单例模式?

其实从技术上考虑主要是考虑节省内存资源(因为访问数据库的话我们实例一次就够了,不需要重复实例[2019.5.28 update]),提升系统性能,但实际能够感受到的就是更方便,而且逼格高一些,所以用它。

什么是单例模式?

举个例子,就是大楼只有一个入口,方便控制,用面向对象来说,就是一个类只有一个实例,方便管理。

代码部分是怎么实现单例模式的?

  1. 首先声明一个私有构造函数,这样就不能在外面使用 new 来实例化多个对象了,你可以用coding 2的代码试一试,会报错
  2. 构造一个公共入口来获取类的实例,总的有实例可用撒,注意这个self指的是当前类,instanceof是检查当前变量是否为类的实例

如何检查单例效果?

你可以用coding 3的代码查看输出结果,然后你会发现构造函数只执行了一次,说明,第一次实例化对象之后,后面的变量对对象的引用是一致的,说明实例实际上只有一个。

为什么getInstance方法是静态的呢?

函数也是变量,静态化变量,不管引用多少次,都不会重复生成,比较节省空间,这里并不考虑多线程的问题。

参考链接

PHP 单例模式解析和实战
PHP 设计模式 单例模式
单例模式5种实现方式
语言中,静态方法和非静态方法你懂多少?

结语

有没懂的或者又觉得不对的,欢迎大家留言。

最后

我会把源代码放在GitHub主页上,别担心,是中文,有需要的可以访问下载.


entner
751 声望187 粉丝

青年 ---------------